#Configuraciones de Python
import pandas as pd
pd.options.display.max_rows = 10
from IPython.display import Image
Image(filename='/Users/oldemarrodriguez/Google Drive/MDCurso/Datos/logo_python2.png')
import matplotlib.pyplot as plt
import numpy as np
Ejemplos de grĆ”ficos de lĆneas (graficando funciones)
# Datos del eje X para los siguientes grƔficos
x = np.linspace(0, 10, 100)
print(x)
Nota: Lo siguiente se ejecuta todo junto
plt.plot(x, np.sin(x))
plt.plot(x, np.cos(x))
plt.figure() # crea la figura
# Crea el primer panel
plt.subplot(2, 1, 1) # (filas, columnas, nĆŗmero de paneles)
plt.plot(x, np.sin(x))
# crea el segundo panel
plt.subplot(2, 1, 2)
plt.plot(x, np.cos(x))
Un estilo Orientado a Objetos para situaciones mƔs complejas
fig, ax = plt.subplots(2)
# Llama el mƩtodo plot() method
ax[0].plot(x, np.sin(x))
ax[1].plot(x, np.cos(x))
plt.plot(x, np.sin(x - 0), color='blue') # Nombre del color
plt.plot(x, np.sin(x - 1), color='g') # Código del color (rgbcmyk)
plt.plot(x, np.sin(x - 2), color='0.75') # escala de gris entre 0 y 1
plt.plot(x, np.sin(x - 3), color='#FFDD44') # Código exadecimal (RRGGBB from 00 to FF)
plt.plot(x, np.sin(x - 4), color=(1.0,0.2,0.3)) # Tupla RGB entre 0 y 1
plt.plot(x, np.sin(x - 5), color='chartreuse') # Nombres de color en HTML
plt.plot(x, x + 0, linestyle='solid')
plt.plot(x, x + 1, linestyle='dashed')
plt.plot(x, x + 2, linestyle='dashdot')
plt.plot(x, x + 3, linestyle='dotted')
# Lo mismo pero con código
plt.plot(x, x + 4, linestyle='-')
plt.plot(x, x + 5, linestyle='--')
plt.plot(x, x + 6, linestyle='-.')
plt.plot(x, x + 7, linestyle=':')
plt.plot(x, np.sin(x))
plt.xlim(-1, 11)
plt.ylim(-1.5, 1.5)
plt.plot(x, np.sin(x))
plt.title("Función Seno(x)")
plt.xlabel("x")
plt.ylabel("Seno(x)")
plt.plot(x, np.sin(x), '-g', label='Seno(x)')
plt.plot(x, np.cos(x), ':b', label='Coseno(x)')
plt.axis('equal')
plt.legend()
Estilo Orientado a Objetos
ax = plt.axes()
ax.plot(x, np.sin(x))
ax.set(xlim=(0, 10), ylim=(-2, 2),
xlabel='x', ylabel='Seno(x)',
title='Un ploteo de Seno(x)')
A la izquierda como función de matplotlib
A la derecha como mƩtodo del objeto ax
plt.xlabel() ā ax.set_xlabel()
plt.ylabel() ā ax.set_ylabel()
plt.xlim() ā ax.set_xlim()
plt.ylim() ā ax.set_ylim()
plt.title() ā ax.set_title()
x = np.linspace(0, 10, 30)
y = np.sin(x)
plt.plot(x, y, 'o', color='black')
from sklearn.datasets import load_iris
iris = load_iris()
print(iris)
caracteristicas = iris.data.T
print(caracteristicas)
plt.scatter(caracteristicas[0], caracteristicas[1],
alpha=0.2,s=100*caracteristicas[3], c=iris.target, cmap='viridis')
plt.xlabel(iris.feature_names[0])
plt.ylabel(iris.feature_names[1])
plt.style.use('seaborn-white')
datos = np.random.randn(1000)
plt.hist(datos)
plt.hist(datos, bins=30, normed=True, alpha=0.5,
histtype='stepfilled', color='steelblue',
edgecolor='none')
Para pruebas de normalidad siempre se plantean asà las hipótesis.
Hipótesis:
H0: La muestra proviene de una distribución normal.
H1: La muestra no proviene de una distribución normal.
Nivel de Significancia: El nivel de significancia que se trabajarĆ” es de 0.05. Alpha=0.05
Criterio de Decisión
Si P < Alpha Se rechaza H0
Si p >= Alpha No se rechaza H0, es decir, los datos SĆ siguen la normal
Test de Shapiro-Wilk
import scipy.stats
datos = np.random.randn(1000)
shapiro_resultados = scipy.stats.shapiro(datos)
print(shapiro_resultados)
p_value = shapiro_resultados[1]
print(p_value)
# interpretación
alpha = 0.05
if p_value > alpha:
print('SĆ sigue la curva Normal (No se rechaza H0)')
else:
print('No sigue la curva Normal (Se rechaza H0)')
Forma GrÔfica: Si los puntos se aproximan a la recta significa que los datos sà siguen la normal.
El Código es:
from statsmodels.graphics.gofplots import qqplot
from matplotlib import pyplot
qqplot(datos, line='s')
# QQ Plot
from statsmodels.graphics.gofplots import qqplot
from matplotlib import pyplot
# q-q plot
qqplot(datos, line='s')
Test de Kolmogorov-Smirnov
ks_resultados = scipy.stats.kstest(datos, cdf='norm')
print(ks_resultados)
p_value = ks_resultados[1]
print(p_value)
# interpretación
alpha = 0.05
if p_value > alpha:
print('SĆ sigue la curva Normal (No se rechaza H0)')
else:
print('No sigue la curva Normal (Se rechaza H0)')
from sklearn.datasets import load_digits
digitos = load_digits(n_class=6)
print(digitos)
fig, ax = plt.subplots(8, 8, figsize=(6, 6))
for i, axi in enumerate(ax.flat):
axi.imshow(digitos.images[i], cmap='binary')
axi.set(xticks=[], yticks=[])
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D # Para una diferente version de matplotlib
fig = plt.figure()
ax = Axes3D(fig)
fig = plt.figure()
ax = Axes3D(fig)
# Datos para la lĆnea en 3D
zline = np.linspace(0, 15, 1000)
xline = np.sin(zline)
yline = np.cos(zline)
ax.plot3D(xline, yline, zline, 'gray')
fig = plt.figure()
ax = Axes3D(fig)
zdata = 15 * np.random.random(100)
xdata = np.sin(zdata) + 0.1 * np.random.randn(100)
ydata = np.cos(zdata) + 0.1 * np.random.randn(100)
ax.scatter3D(xdata, ydata, zdata, c=zdata, cmap='Greens')
import seaborn as sns
iris = sns.load_dataset("iris")
print(iris.head())
corr = sns.pairplot(iris, hue='species', size=2.5)
import pandas as pd
import prince
import os
import pandas as pd
import numpy as np
os.chdir("/Users/oldemarrodriguez/Google Drive/MDCurso/Datos")
print(os.getcwd())
datos = pd.read_csv('SAheart.csv',delimiter=';',decimal=".")
print(datos.head())
print(datos.shape)
describe() es como el summary de R para las variables numƩricas
print(datos.dropna().describe())
print(datos.describe())
print(datos.mean(numeric_only=True))
print(datos.median(numeric_only=True))
print(datos.std(numeric_only=True))
print(datos.max(numeric_only=True))
Los percentiles
print(datos.quantile(np.array([0,.25,.50,.75,1])))
Contando datos en las variables categóricas
print(pd.crosstab(index=datos["chd"],columns="count"))
print(pd.crosstab(index=datos["famhist"],columns="count"))
Otra forma
print(datos['chd'].value_counts())
print(datos["famhist"].value_counts())
Tablas cruzadas
famhist_chd = pd.crosstab(index=datos["famhist"], columns=datos["chd"])
print(famhist_chd)
famhist_chd.index = ["Absent","Present"]
print(famhist_chd)
Otra forma
g_chd = pd.crosstab(index=datos["chd"],columns="count")
print(g_chd)
print(g_chd['count'][0])
print(g_chd['count'][1])
g_famhist = pd.crosstab(index=datos["famhist"],columns="count")
print(g_famhist)
print(g_famhist['count'][0])
print(g_famhist['count'][1])
GrÔfico de la distribución de la variable chd
import matplotlib.pyplot as plt
alto = [g_chd['count'][0], g_chd['count'][1]]
barras = ('No', 'SĆ')
y_pos = np.arange(len(barras))
plt.bar(y_pos, alto, color=['red','blue'])
plt.xticks(y_pos, barras)
GrÔfico de la distribución de la variable famhist
alto = [g_famhist['count'][0], g_famhist['count'][1]]
barras = ('Absent ', 'Present')
y_pos = np.arange(len(barras))
plt.bar(y_pos, alto, color=['red','blue'])
plt.xticks(y_pos, barras)
Box Plots
datos.head()
boxplots = datos.boxplot(return_type='axes')
Funciones de densidad
densidad = datos[datos.columns[:1]].plot(kind='density')
densidad = datos[datos.columns[8:9]].plot(kind='density')
densidad = datos['age'].plot(kind='density')
densidad = datos[datos.columns[:10]].plot(kind='density')
Histogramas
densidad = datos[datos.columns[:1]].plot(kind='hist')
densidad = datos[datos.columns[8:9]].plot(kind='hist')
densidad = datos['age'].plot(kind='hist')
densidad = datos[datos.columns[:10]].plot(kind='hist')
GrƔfico de pares de todas las variables 2 a 2
import seaborn as sns
import matplotlib.pyplot as plt
sns.pairplot(datos, hue='chd', size=2.5)
sns.pairplot(datos, hue='famhist', size=2.5)
Nota: Es "inteligente" e ingnora las variables categóricas
corr = datos.corr()
print(corr)
f, ax = plt.subplots(figsize=(10, 8))
sns.heatmap(corr, mask=np.zeros_like(corr, dtype=np.bool), cmap=sns.diverging_palette(220, 10, as_cmap=True),
square=True, ax=ax)
os.chdir("/Users/oldemarrodriguez/Google Drive/MDCurso/Datos")
#print(os.getcwd())
datos = pd.read_csv('SAheart.csv',delimiter=';',decimal=".")
print(datos.head())
# Contando la cantidad en cada categorĆa
print(pd.value_counts(datos["chd"]))
# Es equivalente
print(datos['chd'].value_counts())
La siguiente función recodifica usando pandas una categorĆa con nĆŗmeros
Nota: Esto NO convierte la variable en numƩrica.
def recodificar(col, nuevo_codigo):
col_cod = pd.Series(col, copy=True)
for llave, valor in nuevo_codigo.items():
col_cod.replace(llave, valor, inplace=True)
return col_cod
Ejemplo
datos["chd"] = recodificar(datos["chd"], {'No':0,'Si':1})
print(datos.head())
# Conteo
print(pd.value_counts(datos["chd"]))
# Es equivalente
print(datos['chd'].value_counts())
A la inversa: Conviertiendo un nĆŗmero en una categorĆa
datos["chd"] = recodificar(datos["chd"], {0:'No',1:'Si'})
print(datos.head())
import numpy as np
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA
from sklearn.datasets import load_digits
digits = load_digits()
print(digits.data.shape)
pca = PCA(2) # Reduce las dimensiones a 2
componentes = pca.fit_transform(digits.data)
print(digits.data.shape)
print(componentes.shape)
plt.scatter(componentes[:, 0], componentes[:, 1],
c=digits.target, edgecolor='none', alpha=0.5,
cmap=plt.cm.get_cmap('viridis', 10))
plt.xlabel('componente 1')
plt.ylabel('componente 2')
plt.colorbar()
import os
import pandas as pd
os.chdir("/Users/oldemarrodriguez/Google Drive/MDCurso/Datos")
datos = pd.read_csv('EjemploEstudiantes.csv',delimiter=';',decimal=",",index_col=0)
print(datos)
print(datos.head())
print(datos.shape)
pca = PCA(n_components=2)
componentes = pca.fit_transform(datos)
print(componentes)
print(datos.shape)
print(componentes.shape)
plt.scatter(componentes[:, 0], componentes[:, 1])
plt.xlabel('componente 1')
plt.ylabel('componente 2')
import matplotlib.pyplot as plt
from prince import PCA
class ACP:
def __init__(self, datos, n_componentes = 5):
self.__datos = datos
self.__modelo = PCA(n_components = n_componentes).fit(self.__datos)
self.__correlacion_var = self.__modelo.column_correlations(datos)
self.__coordenadas_ind = self.__modelo.row_coordinates(datos)
self.__contribucion_ind = self.__modelo.row_contributions(datos)
self.__cos2_ind = self.__modelo.row_cosine_similarities(datos)
self.__var_explicada = [x * 100 for x in self.__modelo.explained_inertia_]
@property
def datos(self):
return self.__datos
@datos.setter
def datos(self, datos):
self.__datos = datos
@property
def modelo(self):
return self.__modelo
@property
def correlacion_var(self):
return self.__correlacion_var
@property
def coordenadas_ind(self):
return self.__coordenadas_ind
@property
def contribucion_ind(self):
return self.__contribucion_ind
@property
def cos2_ind(self):
return self.__cos2_ind
@property
def var_explicada(self):
return self.__var_explicada
self.__var_explicada = var_explicada
def plot_plano_principal(self, ejes = [0, 1], ind_labels = True, titulo = 'Plano Principal'):
x = self.coordenadas_ind[ejes[0]].values
y = self.coordenadas_ind[ejes[1]].values
plt.style.use('seaborn-whitegrid')
plt.scatter(x, y, color = 'gray')
plt.title(titulo)
plt.axhline(y = 0, color = 'dimgrey', linestyle = '--')
plt.axvline(x = 0, color = 'dimgrey', linestyle = '--')
inercia_x = round(self.var_explicada[ejes[0]], 2)
inercia_y = round(self.var_explicada[ejes[1]], 2)
plt.xlabel('Componente ' + str(ejes[0]) + ' (' + str(inercia_x) + '%)')
plt.ylabel('Componente ' + str(ejes[1]) + ' (' + str(inercia_y) + '%)')
if ind_labels:
for i, txt in enumerate(self.coordenadas_ind.index):
plt.annotate(txt, (x[i], y[i]))
def plot_circulo(self, ejes = [0, 1], var_labels = True, titulo = 'CĆrculo de Correlación'):
cor = self.correlacion_var.iloc[:, ejes].values
plt.style.use('seaborn-whitegrid')
c = plt.Circle((0, 0), radius = 1, color = 'steelblue', fill = False)
plt.gca().add_patch(c)
plt.axis('scaled')
plt.title(titulo)
plt.axhline(y = 0, color = 'dimgrey', linestyle = '--')
plt.axvline(x = 0, color = 'dimgrey', linestyle = '--')
inercia_x = round(self.var_explicada[ejes[0]], 2)
inercia_y = round(self.var_explicada[ejes[1]], 2)
plt.xlabel('Componente ' + str(ejes[0]) + ' (' + str(inercia_x) + '%)')
plt.ylabel('Componente ' + str(ejes[1]) + ' (' + str(inercia_y) + '%)')
for i in range(cor.shape[0]):
plt.arrow(0, 0, cor[i, 0] * 0.95, cor[i, 1] * 0.95, color = 'steelblue',
alpha = 0.5, head_width = 0.05, head_length = 0.05)
if var_labels:
plt.text(cor[i, 0] * 1.05, cor[i, 1] * 1.05, self.correlacion_var.index[i],
color = 'steelblue', ha = 'center', va = 'center')
def plot_sobreposicion(self, ejes = [0, 1], ind_labels = True,
var_labels = True, titulo = 'Sobreposición Plano-CĆrculo'):
x = self.coordenadas_ind[ejes[0]].values
y = self.coordenadas_ind[ejes[1]].values
cor = self.correlacion_var.iloc[:, ejes]
scale = min((max(x) - min(x)/(max(cor[ejes[0]]) - min(cor[ejes[0]]))),
(max(y) - min(y)/(max(cor[ejes[1]]) - min(cor[ejes[1]])))) * 0.7
cor = self.correlacion_var.iloc[:, ejes].values
plt.style.use('seaborn-whitegrid')
plt.axhline(y = 0, color = 'dimgrey', linestyle = '--')
plt.axvline(x = 0, color = 'dimgrey', linestyle = '--')
inercia_x = round(self.var_explicada[ejes[0]], 2)
inercia_y = round(self.var_explicada[ejes[1]], 2)
plt.xlabel('Componente ' + str(ejes[0]) + ' (' + str(inercia_x) + '%)')
plt.ylabel('Componente ' + str(ejes[1]) + ' (' + str(inercia_y) + '%)')
plt.scatter(x, y, color = 'gray')
if ind_labels:
for i, txt in enumerate(self.coordenadas_ind.index):
plt.annotate(txt, (x[i], y[i]))
for i in range(cor.shape[0]):
plt.arrow(0, 0, cor[i, 0] * scale, cor[i, 1] * scale, color = 'steelblue',
alpha = 0.5, head_width = 0.05, head_length = 0.05)
if var_labels:
plt.text(cor[i, 0] * scale * 1.15, cor[i, 1] * scale * 1.15,
self.correlacion_var.index[i],
color = 'steelblue', ha = 'center', va = 'center')
os.chdir("/Users/oldemarrodriguez/Google Drive/MDCurso/Datos")
datos = pd.read_csv('EjemploEstudiantes.csv',delimiter=';',decimal=",",index_col=0)
print(datos)
print(datos.shape)
# Declara la instancia de clase
acp = ACP(datos,n_componentes=3)
# Despliega las Componenentes Principales
print(acp.coordenadas_ind)
# Despliega los cosenos cuadrados de los individuos
print(acp.cos2_ind)
# Despliega las correlaciones de las variables con respecto a las componentes
print(acp.correlacion_var)
# Plotea el plano principal
acp.plot_plano_principal()
# Plotea el cĆrculo de correlación
acp.plot_circulo()
# Plotea la sobreposición plano-correlación
acp.plot_sobreposicion()
# Plotea el plano principal
acp.plot_plano_principal(ejes = [0, 2])
# Plotea el cĆrculo de correlación
acp.plot_circulo(ejes = [0, 2])
# Plotea la sobreposición plkano-correlación
acp.plot_sobreposicion(ejes = [0, 2])
os.chdir("/Users/oldemarrodriguez/Google Drive/MDCurso/Datos")
iris = pd.read_csv('iris.csv',delimiter=';',decimal=".")
print(iris.head())
print(iris.shape)
iris2 = pd.DataFrame(data=iris, columns=['s.largo', 's.ancho', 'p.largo', 'p.ancho'])
acp = ACP(iris2,n_componentes=4)
# Plotea el plano principal
acp.plot_plano_principal()
# Plotea el cĆrculo de correlación
acp.plot_circulo()
# Plotea la sobreposición plano-correlación
acp.plot_sobreposicion()
os.chdir("/Users/oldemarrodriguez/Google Drive/MDCurso/Datos")
datos = pd.read_csv('EjemploEstudiantes_Categoricas.csv',delimiter=';',decimal=",",index_col=0)
print(datos.head())
print(datos.shape)
print(datos.dtypes)
# Recodificando la variable "Conducta" usando texto y luego se convierten a variables Dummy
datos["Conducta"] = recodificar(datos["Conducta"], {1:'Mala',2:'Regular',3:'Buena'})
print(datos.head())
print(datos.dtypes)
# Conviertiendo la variables en Dummy
datos_dummy = pd.get_dummies(datos)
print(datos_dummy.head())
print(datos_dummy.dtypes)
acp = ACP(datos_dummy,n_componentes=3)
# Plotea el Plano Principal
acp.plot_plano_principal()
# Plotea el cĆrculo de correlación
acp.plot_circulo()
# Plotea la sobreposición plano-correlación
acp.plot_sobreposicion()